package models.vo {

  import helpers.Constants;

  import org.restfulx.collections.ModelsCollection;
  import org.restfulx.models.RxModel;

  [Resource(name="pleitos")]

  [Bindable]
  public class Pleito extends RxModel {

    public static const LABEL:String = "codigo";

    public var codigo:String;

    public var status:String;

    public var dataLaudo:Date;

    public var dataPortaria:Date;

    public var dataOficioEmpresa:Date;

    public var dataOficioEmpresaLiberacao:Date;

    public var dataOficioReceita:Date;

    public var dataOficioBnb:Date;

    public var dataOficioMarinha:Date;

    public var dataProtocolo:Date;

    public var numeroProtocolo:String;

    public var numeroProcesso:String;

    public var dataProcesso:Date;

    public var codigoArquivo:String;

    public var documentosAdicionais:String;

    public var numeroLaudo:int = 0;

    public var numeroPortaria:int;

    public var numeroOficioEmpresa:int;

    public var numeroOficioEmpresaLiberacao:int;

    public var numeroOficioReceita:int;

    public var numeroOficioBnb:int;

    public var numeroOficioMarinha:int;

    [Ignore]
    public var conclusaoVistoria:String = "";

    [Ignore]
    public var investimentosAnalise:String = "";

    [Ignore]
    public var depositosAnalise:String = "";

    [Ignore]
    public var informacoesComplementaresAnalise:String = "";

    [Ignore]
    public var parecerAnalise:String = "";

    [Ignore]
    public var condicoesAtendidasAnalise:String = "";

    [Ignore]
    public var numeroLaudoFormatado:String;

    [Ignore]
    public var tipoProjetoDescricao:String;

    [BelongsTo]
    public var user:User;

    [HasOne]
    public var incentivo:Incentivo;

    [HasOne]
    public var caracterizacao:Caracterizacao;

    [HasOne]
    public var empreendimento:Empreendimento;

    [HasOne]
    public var analise:Analise;

    [HasMany]
    public var documentosApresentados:ModelsCollection;

    [HasMany]
    public var tramitacoes:ModelsCollection;

    //////////////////////////////////////////////////////////////////////////////////////////////////////

    public function Pleito() {
      super(LABEL);
    }

    //////////////////////////////////////////////////////////////////////////////////////////////////////

    public function getIncentivo():Incentivo {
      if (!incentivo)
        incentivo = new Incentivo();

      return incentivo;
    }

    //////////////////////////////////////////////////////////////////////////////////////////////////////

    public function getCaracterizacao():Caracterizacao {
      if (!caracterizacao)
        caracterizacao = new Caracterizacao();

      return caracterizacao;
    }

    //////////////////////////////////////////////////////////////////////////////////////////////////////

    public function getEmpreendimento():Empreendimento {
      if (!empreendimento)
        empreendimento = new Empreendimento();

      return empreendimento;
    }

    //////////////////////////////////////////////////////////////////////////////////////////////////////

    public function getAnalise():Analise {
      if (!analise)
        analise = new Analise();

      return analise;
    }

    //////////////////////////////////////////////////////////////////////////////////////////////////////

    public function getDocumentosApresentados():ModelsCollection {
      if (!documentosApresentados)
        documentosApresentados = new ModelsCollection();
      return documentosApresentados;
    }

    //////////////////////////////////////////////////////////////////////////////////////////////////////

    public function getTramitacoes():ModelsCollection {
      if (!tramitacoes)
        tramitacoes = new ModelsCollection();
      return tramitacoes;
    }

    //////////////////////////////////////////////////////////////////////////////////////////////////////

    public function getTramitacao(status:String, createIfDoesNotExist:Boolean = false):Tramitacao {
      var result:Tramitacao = null;
      var lista:ModelsCollection = getTramitacoes();

      for (var i:Number = 0; i < lista.length; i++)
        if (Tramitacao(lista[i]).status == status) {
          result = Tramitacao(lista[i]);
          break;
        }

      if (!result && createIfDoesNotExist) {

        result = new Tramitacao();
        result.status = status;

        lista.addItem(result);
      }

      return result;
    }

    //////////////////////////////////////////////////////////////////////////////////////////////////////

    public function algumDocumentoComBronca():Boolean {
      if (!documentosApresentados || documentosApresentados.length <= 0)
        return true;
      for each (var docto:DocumentoApresentado in documentosApresentados) {
        if (docto.vencido(dataProtocolo) || (docto.documento.obrigatorio && !docto.entregue))
          return true;
      }
      return false;
    }

    //////////////////////////////////////////////////////////////////////////////////////////////////////

    public function emDistribuicao():Boolean {
      return (status == Constants.STATUS_PLEITO_DISTRIBUICAO);
    }

    //////////////////////////////////////////////////////////////////////////////////////////////////////

    public function emAnalise():Boolean {
      return (status == Constants.STATUS_PLEITO_ANALISE);
    }

    //////////////////////////////////////////////////////////////////////////////////////////////////////

    public function emAnaliseOuAcima():Boolean {
      return (emAnalise() || emCertificacaoOuAcima());
    }

    //////////////////////////////////////////////////////////////////////////////////////////////////////

    public function emCertificacao():Boolean {
      return (status == Constants.STATUS_PLEITO_CERTIFICACAO);
    }

    //////////////////////////////////////////////////////////////////////////////////////////////////////

    public function emCertificacaoOuAcima():Boolean {
      return (emCertificacao() || emRecomendacaoOuAcima());
    }

    //////////////////////////////////////////////////////////////////////////////////////////////////////

    public function emRecomendacao():Boolean {
      return (status == Constants.STATUS_PLEITO_RECOMENDACAO);
    }

    //////////////////////////////////////////////////////////////////////////////////////////////////////

    public function emRecomendacaoOuAcima():Boolean {
      return (emRecomendacao() || emDeliberacaoOuAcima());
    }

    //////////////////////////////////////////////////////////////////////////////////////////////////////

    public function emDeliberacao():Boolean {
      return (status == Constants.STATUS_PLEITO_DELIBERACAO);
    }

    //////////////////////////////////////////////////////////////////////////////////////////////////////

    public function emDeliberacaoOuAcima():Boolean {
      return (emDeliberacao() || aprovado());
    }

    //////////////////////////////////////////////////////////////////////////////////////////////////////

    public function aprovado():Boolean {
      return (status == Constants.STATUS_PLEITO_APROVADO);
    }

    //////////////////////////////////////////////////////////////////////////////////////////////////////

    public function arquivado():Boolean {
      return (status == Constants.STATUS_PLEITO_ARQUIVADO);
    }

    //////////////////////////////////////////////////////////////////////////////////////////////////////

    public function passouPelaAnalise():Boolean {
      return (getTramitacao(Constants.STATUS_PLEITO_ANALISE, false) != null);
    }

    //////////////////////////////////////////////////////////////////////////////////////////////////////

    public function pjObjetoIgualPjTitular():Boolean {
      return getEmpreendimento().pjObjetoIgualPjTitular();
    }

    //////////////////////////////////////////////////////////////////////////////////////////////////////

    public function emExigencia():Boolean {
      getAnalise().getExigencias();

      for (var i:int = 0; i < analise.exigencias.length; i++) {
        if (!Exigencia(analise.exigencias[i]).baixa) {
          return true;
        }
      }
      return false;
    }

  }
}